#include <stdio.h>
#include <float.h>
#include <limits.h>

// 函数声明
void overflow_test(void);
void print_ascii(void);
void print_alert(void);
void print_float_format(void);
void print_age_in_seconds(void);
void print_water_molecules(void);
void print_height_in_cm(void);
void print_volume_conversion(void);
int main(void){
    // overflow_test();
    // print_ascii();
    // print_alert();
    // print_float_format();
    // print_age_in_seconds();
    // print_water_molecules();
    // print_height_in_cm();
    print_volume_conversion();
    return 0;
}

//通过试验（即编写带有此类问题的程序）观察系统如何处理整数上溢、浮点数上溢和浮点数下溢的情况
//其中整数上溢的影响最大，因为会导致数值突然从最大值变为最小值，而浮点数溢出相对更容易被发现
void overflow_test(void){
    // 整数上溢测试
    int i = INT_MAX;
    printf("整数上溢测试:\n");
    printf("INT_MAX = %d\n", i);
    printf("INT_MAX + 1 = %d\n\n", i + 1);

    // 浮点数上溢测试
    float f = FLT_MAX;
    printf("浮点数上溢测试:\n");
    printf("FLT_MAX = %e\n", f);
    printf("FLT_MAX * 2 = %e\n\n", f * 2);

    // 浮点数下溢测试
    float f_min = FLT_MIN;
    printf("浮点数下溢测试:\n");
    printf("FLT_MIN = %e\n", f_min);
    printf("FLT_MIN / 2 = %e\n", f_min / 2);
}

//编写一个程序，要求提示输入一个ASCII码值（如，66），然后打印输入的字符
void print_ascii(void){
    printf("请输入一个ASCII码值：");
    int ascii_value;
    scanf("%d", &ascii_value);
    printf("对应的字符是：%c\n", (char)ascii_value);
}

/*
编写一个程序，发出一声警报，然后打印下面的文本
Startled by the sudden sound, Sally shouted,
"By the Great Pumpkin, what was that!"
*/
void print_alert(void){
    printf("\a");
    printf("Startled by the sudden sound, Sally shouted,\n");
    printf("\"By the Great Pumpkin, what was that!\"\n");
}

/*
编写一个程序，读取一个浮点数，先打印成小数点形式，再打印成指数形式。然后，如果系统支持，再打印成p 记数法（即十六进制记数法）。按以下格式输出（实际显示的指数位数因系统而异）：
Enter a floating-point value: 64.25


fixed-point notation: 64.250000
exponential notation: 6.425000e+01
p notation: 0x1.01p+6

*/

void print_float_format(void){
    printf("请输入一个浮点数：");
    float value;
    scanf("%f", &value);
    printf("fixed-point notation: %f\n", value);
    printf("exponential notation: %e\n", value);
    // 如果系统支持p记数法，使用%a格式输出
    printf("p notation: %a\n", value);
}

//一年大约有3.156×107 秒。编写一个程序，提示用户输入年龄，然后显示该年龄对应的秒数
void print_age_in_seconds(void){
    printf("请输入你的年龄：");
    int age;
    scanf("%d", &age);
    long seconds = age * 31560000; // 3.156 × 10^7
    printf("你的年龄是：%d岁\n", age);
    printf("换算成秒数是：%ld秒\n", seconds);
}

//1个水分子的质量约为3.0×10−23 克。1夸脱水大约是950克。编写一个程序，提示用户输入水的夸脱数，并显示水分子的数量
void print_water_molecules(void){
    printf("请输入水的夸脱数：");
    float quarts;
    scanf("%f", &quarts);
    float grams = quarts * 950; // 1夸脱水大约是950克
    float molecules = grams / (3.0e-23); // 1个水分子的质量约为3.0×10−23 克
    printf("水分子的数量是：%e\n", molecules);
}

//1英寸相当于2.54厘米。编写一个程序，提示用户输入身高（/英寸），然后以厘米为单位显示身高
void print_height_in_cm(void){
    printf("请输入身高（英寸）：");
    float height_inches;
    scanf("%f", &height_inches);
    float height_cm = height_inches * 2.54; // 1英寸相当于2.54厘米
    printf("身高是：%.2f厘米\n", height_cm);
}

/*在美国的体积测量系统中，1品脱等于2杯，1杯等于8盎司，1盎司等于2大汤勺，1大汤勺等于3茶勺。编写一个程序，提示用户输入杯数，并以品脱、盎司、汤勺、茶勺为单位显示等价容量。思考对于该程序，为何使用浮点类型比整数类型更合适？
使用浮点类型比整数类型更合适的原因是：

用户可能输入非整数的杯数（如1.5杯）
转换过程中会产生分数结果（如1杯=0.5品脱）
需要精确表示小数部分，以避免测量误差的累积
在实际烹饪中，经常需要处理非整数的量度
*/
void print_volume_conversion(void){
    printf("请输入杯数：");
    float cups;
    scanf("%f", &cups);
    float pints = cups / 2; // 1品脱等于2杯
    float ounces = cups * 8; // 1杯等于8盎司
    float tablespoons = ounces * 2; // 1盎司等于2大汤勺
    float teaspoons = tablespoons * 3; // 1大汤勺等于3茶勺
    printf("等价容量：\n");
    printf("品脱：%.2f\n", pints);
    printf("盎司：%.2f\n", ounces);
    printf("汤勺：%.2f\n", tablespoons);
    printf("茶勺：%.2f\n", teaspoons);
}